/**
 * @file hash_util.h
 * @brief 哈希工具类
 * @details 提供SHA-256等哈希算法的计算功能
 */

#pragma once

#include <string>
#include <vector>

/**
 * @class HashUtil
 * @brief 哈希工具类
 * @details 提供文件和数据的哈希计算功能
 */
class HashUtil 
{
public:
    /**
     * @brief 计算文件的SHA-256哈希值
     * @param file_path 文件路径
     * @return std::string 哈希值的十六进制字符串，失败返回空字符串
     */
    static std::string calculateFileSHA256(const std::string& file_path);
    
    /**
     * @brief 计算数据的SHA-256哈希值
     * @param data 数据缓冲区
     * @param size 数据大小
     * @return std::string 哈希值的十六进制字符串
     */
    static std::string calculateDataSHA256(const void* data, size_t size);
    
    /**
     * @brief 计算字符串的SHA-256哈希值
     * @param str 输入字符串
     * @return std::string 哈希值的十六进制字符串
     */
    static std::string calculateStringSHA256(const std::string& str);
    
    /**
     * @brief 流式SHA-256哈希计算上下文
     */
    class SHA256Context 
    {
    public:
        /**
         * @brief 构造函数，初始化哈希上下文
         */
        SHA256Context();
        
        /**
         * @brief 析构函数，清理资源
         */
        ~SHA256Context();
        
        /**
         * @brief 更新哈希计算
         * @param data 数据缓冲区
         * @param size 数据大小
         * @return bool 更新是否成功
         */
        bool update(const void* data, size_t size);
        
        /**
         * @brief 完成哈希计算并获取结果
         * @return std::string 哈希值的十六进制字符串
         */
        std::string finalize();
        
        /**
         * @brief 重置哈希上下文
         */
        void reset();

    private:
        void* ctx_;  ///< OpenSSL哈希上下文指针
        bool finalized_;  ///< 是否已完成计算
    };

private:
    /**
     * @brief 将字节数组转换为十六进制字符串
     * @param bytes 字节数组
     * @param size 数组大小
     * @return std::string 十六进制字符串
     */
    static std::string bytesToHex(const unsigned char* bytes, size_t size);
}; 